
/*
ListaCircular.java
Autor: Luis Antonio Sigüenza Leiva
Carné: 10297
Fecha: 01 de septiembre del 2011
 * Descripcion: clase que simula la cola (circular) de un banco. 
*/

//******************************************************************
//REFERENCIA DE CLASE TOMADA DEL LIBRO:
//Java Structures: Data Structures for the Principled Programmer
//Capitulo 9: Listas. Pagina 207
//******************************************************************

public class ListaCircular <E> extends QueueAbstracta <E> {
    //Atributos de la clase
    public Nodo <E> lista;
    
    //Método constructor: inicializa el estado del objeto
    public ListaCircular(int t){
        tamaño=t;
        cont=0;
        lista=null;
    }
    

    //Metodo para agregar valores a la cola
    @Override
    public void add(E e) throws Desbordamiento {
        Nodo <E> lista2 = new Nodo(e);
        if (!this.lleno()){
            if (lista==null){
                lista=lista2;
                lista.setNext(lista);
        }else{
            lista2.setNext(lista.getNext());
            lista.setNext(lista2);
        }
            this.cont= cont+1;
            lista=lista.next();
        }else {
            throw new Desbordamiento("Desbordamiento");
        }
    }
    
    
    //Metodo extrae el elemento de cabeza de la lista
   // @Override
    @Override
    public E poll() throws Subdesbordamiento{
        Nodo <E> lista2 = lista;
        if (!this.isEmpty()){
            while(lista2.next()!=lista)
                    lista2= lista.getNext();
            Nodo <E> lista2b = lista;
            
            if (lista2==lista){
                lista=null;
            }else{
                lista2.setNext(lista.getNext());
                lista=lista2;
            }
            this.cont= cont-1;
            return (E)lista2b.getData();
        }else{
            throw new Subdesbordamiento("Subdesbordamiento");
        }
            
    }
    
    
    //Método que devuelve el elemento de cabeza de la lista
    @Override
    public E peek() throws Subdesbordamiento{
        Nodo <E> lista2 = lista;
        if (!this.isEmpty()){
        while (lista2!=lista)
           lista2= lista.next();
        return (E)lista2.getData();
        }else {
          throw new Subdesbordamiento("Subdesbordamiento");  
        }
        
    }
    
    
    //Método que devuelve la cantidad de elementos en la lista
    public int getCont(){
        return this.cont;
    }

}   
